//#[derive(Debug)]

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }

    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }

    fn square(size: u32) -> Rectangle {
        Rectangle {width: size, height:size }
    }
}

fn main() {
   let width1 = 30;
   let height1 = 50;

   let rect1 = (40, 50);
   let rect_struct = Rectangle {width:40, height: 60};
   let rect_impl = Rectangle {width: 50, height: 60};
   let sq = Rectangle::square(30);

   println!("Площадь прямоугольника равна {} квадратным пикселям.",
            area(width1, height1));
   println!("Площадь прямоугольника равна {} квадратным пикселям.",
            area_pup(rect1));
   println!("Площадь прямоугольника равна {} квадратным пикселям.",
            area_struct(&rect_struct));
   println!("Площадь прямоугольника равна {} квадратным пикселем.",
            rect_impl.area());
   println!("Может ли rect_struct содержать в себе rect_impl? {}", 
            rect_struct.can_hold(&rect_impl));
   println!("Кадрат чего та {}", sq.area());

}

fn area(width: u32, height: u32) -> u32 {
    width * height
}

fn area_pup(dimensions: (u32, u32)) -> u32 {
    dimensions.0 * dimensions.1
}

fn area_struct(rectangle: &Rectangle) -> u32 {
    rectangle.width * rectangle.height
}
